import { ElMessage } from 'element-plus';
import { createFileFormData, debugFormData } from '@/utils/formDataHelper';
import { uploadFile } from '@/utils/request';

export interface PPTGenerationState {
  isCreateLoading: boolean;
  downloadUrl: string;
}

/**
 * PPT 服务类
 */
export class PPTService {
  /**
   * 生成 PPT
   * @param markdownContent Markdown 内容
   * @param filename 文件名（可选）
   * @returns Promise<{ success: boolean, downloadUrl?: string, message?: string }>
   */
  static async generatePPT(
    markdownContent: string,
    filename: string = 'report.md',
  ): Promise<{ success: boolean; downloadUrl?: string; message?: string }> {
    try {
      // 创建 FormData
      const formData = createFileFormData(markdownContent, filename, 'text/markdown');

      // 调试信息（开发环境）
      if (import.meta.env.DEV) {
        console.log('发送 PPT 生成请求:');
        debugFormData(formData);
      }

      // 调用接口生成 PPT
      const response = await uploadFile('/intelligent/ppt', formData);

      if (response.result?.code === 0) {
        return {
          success: true,
          downloadUrl: response.result.data,
          message: '生成PPT成功！',
        };
      }
      else {
        return {
          success: false,
          message: response.result?.msg || '生成PPT失败',
        };
      }
    }
    catch (error) {
      console.error('生成PPT失败:', error);
      return {
        success: false,
        message: '文件上传失败',
      };
    }
  }

  /**
   * 下载 PPT
   * @param downloadUrl 下载链接
   * @param filename 文件名
   */
  static downloadPPT(downloadUrl: string, filename: string = 'presentation.pptx'): void {
    try {
      const link = document.createElement('a');
      link.href = downloadUrl;
      link.download = filename;
      link.target = '_blank';
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      ElMessage.success('开始下载PPT');
    }
    catch (error) {
      console.error('下载PPT失败:', error);
      ElMessage.error('下载失败，请稍后重试');
    }
  }

  /**
   * 获取 PPT 预览链接
   * @param downloadUrl PPT 文件链接
   * @returns 预览链接
   */
  static getPPTPreviewUrl(downloadUrl: string): string {
    // 方案1: 如果服务器支持在线预览
    if (downloadUrl.includes('preview=true')) {
      return downloadUrl;
    }

    // 方案2: 使用 Office Online Viewer（仅适用于公网可访问的文件）
    // return `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(downloadUrl)}`

    // 方案3: 返回原始链接，在组件中处理预览逻辑
    return downloadUrl;
  }

  /**
   * 检查是否为 PPT 文件
   * @param url 文件链接
   * @returns boolean
   */
  static isPPTFile(url: string): boolean {
    const pptExtensions = ['.ppt', '.pptx', '.pps', '.ppsx'];
    const urlLower = url.toLowerCase();
    return pptExtensions.some(ext => urlLower.includes(ext));
  }

  /**
   * 验证 Markdown 内容是否适合生成 PPT
   * @param content Markdown 内容
   * @returns 验证结果对象，包含是否有效和错误信息
   */
  static validateMarkdownForPPT(content: string): { valid: boolean; message?: string } {
    if (!content || content.trim().length === 0) {
      return { valid: false, message: '内容不能为空' };
    }

    // 检查是否包含标题（PPT 通常需要标题结构）
    const hasHeadings = /^#{1,6}\s+(?:\S.*|[\t\v\f \xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF])$/m.test(content);
    if (!hasHeadings) {
      return {
        valid: false,
        message: '建议内容包含标题结构（使用 # 标记），这样生成的PPT效果更好',
      };
    }

    // 检查内容长度
    if (content.length > 50000) {
      return {
        valid: false,
        message: '内容过长，建议控制在50000字符以内',
      };
    }

    return { valid: true };
  }
}

export default PPTService;
